
"""
rng.uniform(): 均匀分布。
rng.normal(): 正态（高斯）分布。
rng.binomial(): 二项分布。
rng.poisson(): 泊松分布。
rng.exponential(): 指数分布。
rng.gamma(): Gamma 分布。
rng.beta(): Beta 分布。
rng.chisquare(): 卡方分布。
rng.f(): F 分布。
rng.standard_t(): 标准 t 分布。
"""

# 通用导入
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import scipy.stats as stats   
import numpy as np

# 均匀分布（uniform）
# 特性：所有结果概率相等
# 可视化：水平直线（连续）或等高的柱状图（离散）
# 连续均匀分布
a, b = 0, 1
x = np.linspace(a, b, 100)
y = stats.uniform.pdf(x, a, b-a)
plt.plot(x, y, label='Continuous Uniform')

# 离散均匀分布（骰子）
outcomes = [1, 2, 3, 4, 5, 6]
plt.bar(outcomes, [1/6]*6, alpha=0.7, label='Discrete Uniform')



# 正态分布（normal）
# 特性：钟形曲线，对称性（均值=众数=中位数）
# 可视化：平滑曲线+标注标准差区间
mu, sigma = 0, 1
x = np.linspace(mu-3*sigma, mu+3*sigma, 100)
y = stats.norm.pdf(x, mu, sigma)
plt.plot(x, y)
plt.fill_between(x, y, where=(abs(x-mu)<=sigma), alpha=0.3, label='1σ (68%)')




# 二项分布（binomial）
# 特性：离散分布，描述n次试验的成功次数
# 可视化：柱状图（显示成功次数的概率）
n, p = 10, 0.5
k_values = range(n+1)
pmf = [stats.binom.pmf(k, n, p) for k in k_values]
plt.bar(k_values, pmf, edgecolor='black', label=f'n={n}, p={p}')



# 泊松分布（poisson）
# 特性：描述稀有事件发生次数（如呼叫中心来电）
# 可视化：柱状图+λ峰值标记
lambda_ = 3  # 平均发生率
k_values = range(0, 10)
pmf = stats.poisson.pmf(k_values, lambda_)
plt.bar(k_values, pmf, color='skyblue', label=f'λ={lambda_}')
plt.axvline(lambda_, color='red', linestyle='--', alpha=0.5, label='Peak at λ')




# 指数分布（exponential）
# 特性：事件间隔时间，无记忆性
# 可视化：递减曲线
beta = 2.0  # 平均间隔时间
x = np.linspace(0, 10, 100)
y = stats.expon.pdf(x, scale=beta)
plt.plot(x, y, label=f'β={beta}')




# Gamma分布（gamma）
# 特性：右偏，描述等待多个事件发生的时间
# 可视化：不同参数（k, θ）的曲线对比
x = np.linspace(0, 10, 100)
params = [(1, 2), (2, 2), (3, 2)]  # (k形状, θ尺度)
for k, theta in params:
    y = stats.gamma.pdf(x, k, scale=theta)
    plt.plot(x, y, label=f'k={k}, θ={theta}')





# 卡方分布（chisquare）
# 特性：右偏，假设检验常用
# 可视化：不同自由度的曲线
df_values = [2, 4, 6]  # 自由度
x = np.linspace(0, 20, 100)
for df in df_values:
    y = stats.chi2.pdf(x, df)
    plt.plot(x, y, label=f'df={df}')






# F分布（f）
# 特性：两个卡方分布之比，ANOVA分析
# 可视化：双自由度影响曲线
x = np.linspace(0.1, 5, 100)
dfn, dfd = 5, 10  # 分子/分母自由度
y = stats.f.pdf(x, dfn, dfd)
plt.plot(x, y, label=f'dfn={dfn}, dfd={dfd}')







# t分布（standard_t）
# 特性：厚尾，小样本估计
# 可视化：与正态分布对比
x = np.linspace(-4, 4, 100)
y_norm = stats.norm.pdf(x)  # 正态分布
y_t = stats.t.pdf(x, df=5)  # t分布（自由度5）
plt.plot(x, y_norm, 'r--', label='Normal')
plt.plot(x, y_t, 'b', label='t (df=5)')





# 分布对比：重叠绘制不同分布（如泊松 vs 正态）
lambda_ = 30
data = stats.poisson.rvs(lambda_, size=1000)
sns.histplot(data, kde=True, stat='density', label='Poisson')
x = np.linspace(min(data), max(data), 100)
plt.plot(x, stats.norm.pdf(x, lambda_, np.sqrt(lambda_)), 'r', label='Normal')







# 3D可视化：Beta分布的参数空间（Plotly实现）
import plotly.graph_objects as go
import scipy.stats as stats
import numpy as np

# 创建参数网格
α_vals = np.arange(0.5, 5, 0.5)
β_vals = np.arange(0.5, 5, 0.5)
α, β = np.meshgrid(α_vals, β_vals)

# 固定 x 值 (例如取中点)
x_fixed = 0.5

# 计算单值 PDF (形状: 9x9)
z = stats.beta.pdf(x_fixed, α, β)

# 创建曲面
fig = go.Figure(data=[go.Surface(z=z, x=α, y=β)])
fig.update_layout(
    scene=dict(
        xaxis_title='α',
        yaxis_title='β',
        zaxis_title=f'PDF(x={x_fixed})'
    ),
    title='Beta Distribution PDF at Fixed x'
)
fig.show()


